package com.wingsfrog.travel.service.impl;

import com.wingsfrog.travel.controller.dto.response.MainTaskDetailResDto;
import com.wingsfrog.travel.controller.dto.response.MainTaskResDto;
import com.wingsfrog.travel.controller.dto.response.MainTaskUserResDto;
import com.wingsfrog.travel.modules.dao.MainTaskDao;
import com.wingsfrog.travel.modules.dao.TaskDao;
import com.wingsfrog.travel.modules.dao.TeamDao;
import com.wingsfrog.travel.modules.dao.UserDao;
import com.wingsfrog.travel.modules.entity.MainTask;
import com.wingsfrog.travel.modules.entity.TeamInfo;
import com.wingsfrog.travel.service.MainTaskService;
import com.wingsfrog.utils.SessionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * Created by rankin on 16/3/30.
 */
@Service
public class MainTaskServiceImpl implements MainTaskService {
    @Autowired
    MainTaskDao mainTaskDao;
    @Autowired
    TaskDao taskDao;
    @Autowired
    UserDao userDao;
    @Autowired
    TeamDao teamDao;

    @Override
    public List<MainTaskResDto> getMainTasks() {

        List mainTaskResDtoList = new ArrayList<>();

        mainTaskDao.findAll().forEach(mainTask -> {

            MainTaskResDto mainTaskResDto = new MainTaskResDto();
            fillMainTaskResDtoWithMainTask(mainTaskResDto, mainTask);

            mainTaskResDtoList.add(mainTaskResDto);
        });
        return mainTaskResDtoList;
    }

    @Override
    public MainTaskDetailResDto getMainTaskDetailById(Integer id, Integer userId) throws Exception {
        MainTask mainTask = findOneOrFail(id);

        MainTaskDetailResDto mainTaskResDto = new MainTaskDetailResDto();
        fillMainTaskResDtoWithMainTask(mainTaskResDto, mainTask);

        mainTaskResDto.setMode(mainTask.getMode());
        mainTaskResDto.setArea(mainTask.getArea());

        TeamInfo teamInfo = teamDao.findByUserIdAndMainTaskId(userId, id);
        if (teamInfo != null) {
            List users = new ArrayList<MainTaskUserResDto>();

            userDao.getUserByTeamId(teamInfo.getId()).forEach(user -> {
                MainTaskUserResDto mainTaskUserResDto = new MainTaskUserResDto();
                mainTaskUserResDto.setBrif(user.getBrif());
                mainTaskUserResDto.setHeadimg(user.getHeadimg());
                mainTaskUserResDto.setId(user.getId());
                mainTaskUserResDto.setNick(user.getNickname());
                mainTaskUserResDto.setSex(Objects.equals(user.getSex(), (byte) 0) ? "女" : "男");
                mainTaskUserResDto.setScore(user.getScore());
                mainTaskUserResDto.setYearsold(user.getYearsold());
                if (Objects.equals(user.getId(), userId))
                    mainTaskUserResDto.setIsYou(true);
                else
                    mainTaskUserResDto.setIsYou(false);
                users.add(mainTaskUserResDto);

            });

            mainTaskResDto.setUsers(users);
        }
        return mainTaskResDto;
    }

    @Override
    public MainTask findOneOrFail(Integer id) throws Exception {
        MainTask mainTask = mainTaskDao.findOne(id);
        if (mainTask == null) throw new Exception("不存在");
        return mainTask;
    }

    public Integer joinMainTask(Integer id, Integer userId) {


        return 1;
    }

    //装填对象
    private void fillMainTaskResDtoWithMainTask(MainTaskResDto mainTaskResDto, MainTask mainTask) {
        mainTaskResDto.setId(mainTask.getId());

        //todo
        Long count = mainTaskDao.findCountByUserIdAndMainTaskId(SessionUtil.getUserId(), mainTask.getId());
        mainTaskResDto.setIsJoin(count > 0);
        mainTaskResDto.setMinCount(mainTask.getMinCount());
        mainTaskResDto.setJoinedNumber(12);
        mainTaskResDto.setScore(taskDao.findSumByMainTaskIdEndingWith(mainTask.getId()));
        mainTaskResDto.setMainTaskDescription(mainTask.getDescription());
        mainTaskResDto.setMainTaskName(mainTask.getMainTaskName());
        mainTaskResDto.setType(mainTask.getType());

    }
}
